//
//  squares_matrix.h
//  linear_algebra
//
//  Created by zhangnan on 2025/3/27.
//

#ifndef squares_matrix_h
#define squares_matrix_h

#include <stdio.h>
#include "matrix.h"

//定义一个双精度浮点数类型的平方矩阵结构体
typedef struct{
    //数组
    double *array;
    //阶数
    int order;
    
} SQUARES_DOUBLE_MATRIX_TYPE;

//定义一个整数类型的平方矩阵结构体
typedef struct{
    //数组
    int *array;
    //阶数
    int order;
    
} SQUARES_INT_MATRIX_TYPE;

/**
 * 创建一个双精度浮点数类型的平方矩阵
 * 
 * @param order 矩阵的阶数
 * @return 返回创建的平方矩阵指针，如果创建失败则返回NULL
 */
SQUARES_DOUBLE_MATRIX_TYPE* create_squares_double_matrix(int order);

/**
 * 创建一个整数类型的平方矩阵
 * 
 * @param order 矩阵的阶数
 * @return 返回创建的平方矩阵指针，如果创建失败则返回NULL
 */
SQUARES_INT_MATRIX_TYPE* create_squares_int_matrix(int order);


/**
 * 释放双精度浮点数类型的矩阵内存
 * 
 * @param matrix 指向SQUARES_DOUBLE_MATRIX_TYPE类型矩阵的指针
 * 
 * 此函数负责释放动态分配的双精度浮点数类型矩阵的内存空间
 * 它通常用于清理不再使用的矩阵，以防止内存泄漏
 */
void free_squares_double_matrix(SQUARES_DOUBLE_MATRIX_TYPE *matrix);

/**
 * 释放整数类型的矩阵内存
 * 
 * @param matrix 指向SQUARES_INT_MATRIX_TYPE类型矩阵的指针
 * 
 * 此函数负责释放动态分配的整数类型矩阵的内存空间
 * 它通常用于清理不再使用的矩阵，以防止内存泄漏
 */
void free_squares_int_matrix(SQUARES_INT_MATRIX_TYPE *matrix);

/**
 * 创建并返回一个给定矩阵的子矩阵，子矩阵由指定行索引和列索引之后的元素组成
 * 主要用于在进行矩阵操作时，需要获取去除特定行和列后剩余部分的子矩阵
 * 
 * @param matrix 指向原始矩阵的指针，基于此矩阵创建子矩阵
 * @param row_index 指定的行索引，子矩阵将从该行之后开始
 * @param col_index 指定的列索引，子矩阵将从该列之后开始
 * 
 * @return 返回一个指向新创建的子矩阵的指针，如果操作失败则返回NULL
 */
SQUARES_DOUBLE_MATRIX_TYPE *create_sub_squares_double_matrix(SQUARES_DOUBLE_MATRIX_TYPE *matrix,int row_index,int col_index);

/**
 * 创建并返回一个给定整数矩阵的子矩阵，子矩阵由指定行索引和列索引之后的元素组成
 * 主要用于在进行整数矩阵操作时，需要获取去除特定行和列后剩余部分的子矩阵
 * 
 * @param matrix 指向原始整数矩阵的指针，基于此矩阵创建子矩阵
 * @param row_index 指定的行索引，子矩阵将从该行之后开始
 * @param col_index 指定的列索引，子矩阵将从该列之后开始
 * 
 * @return 返回一个指向新创建的子矩阵的指针，如果操作失败则返回NULL
 */
SQUARES_INT_MATRIX_TYPE *create_sub_squares_int_matrix(SQUARES_INT_MATRIX_TYPE *matrix,int row_index,int col_index);


/**
 * 将方阵的双精度浮点数矩阵转换为双精度浮点数矩阵
 * 
 * @param matrix 指向方阵的双精度浮点数矩阵的指针
 * @return 返回转换后的双精度浮点数矩阵的指针
 */
MATRIX_DOUBLE_TYPE *squares_to_double_matrix(SQUARES_DOUBLE_MATRIX_TYPE *matrix);

/**
 * 将方阵的整数矩阵转换为整数矩阵
 * 
 * @param matrix 指向方阵的整数矩阵的指针
 * @return 返回转换后的整数矩阵的指针
 */
MATRIX_INT_TYPE *squares_to_int_matrix(SQUARES_INT_MATRIX_TYPE *matrix);

#endif /* squares_matrix_h */
